package org.soderiakelvy.controller.sujeto;


import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;

import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.primefaces.event.SelectEvent;
import org.soderiakelvy.controller.util.Constante;
import org.soderiakelvy.controller.util.SelectOneMany;
import org.soderiakelvy.controller.util.Util;
import org.soderiakelvy.controller.util.Validar;
import org.soderiakelvy.model.domain.ComercializacionPackVO;
import org.soderiakelvy.model.domain.FrioCalorVO;
import org.soderiakelvy.model.domain.PackVO;
import org.soderiakelvy.model.domain.ProductoVO;
import org.soderiakelvy.model.domain.TipoClienteVO;

import org.soderiakelvy.model.domain.SucursalVO;
import org.soderiakelvy.model.domain.SujetoVO;
import org.soderiakelvy.model.domain.VisitaVO;
import org.soderiakelvy.model.service.ProductoServicio;
import org.soderiakelvy.model.service.RepartoServicio;
import org.soderiakelvy.model.service.SucursalServicio;
import org.soderiakelvy.model.service.SujetoServicio;
import org.soderiakelvy.model.service.imp.ProductoServicioImp;
import org.soderiakelvy.model.service.imp.RepartoServicioImp;
import org.soderiakelvy.model.service.imp.SucursalServicioImp;
import org.soderiakelvy.model.service.imp.SujetoServicioImpl;
import org.soderiakelvy.model.util.ConstantModel;

@ManagedBean
@SessionScoped
public class SujetoResidencialCreate2 {
	private ComercializacionPackVO comPack = new ComercializacionPackVO();
	private VisitaVO visita;
	private String[] diasSeleccionados;
	private ProductoVO[] productosSeleccionados;
	private FrioCalorVO[] equiposSeleccionados;
	private SucursalVO sucursal;
	private List<ProductoVO> listaProductoPrecio;
	private List<FrioCalorVO> listaFrioCalor = SelectOneMany.getAllFrioCalorDisponibles();
	private List<FrioCalorVO> listaFrioCalorSeleccionados = new ArrayList<FrioCalorVO>();
	private FrioCalorVO frioCalorSeleccionado;
	private FrioCalorVO frioCalorSeleccionado1;
	private String ubicacion = "";
	
	private String nombreCompleto;
	private String direccionCompleta;
	
	private SujetoVO sujeto;
	
	// variables para validar
		private String deshabilitarGuardar = "true";
		private boolean nombreValido;
		private boolean apellidoValido;
		private boolean barrioValido;
		private boolean calleValido;
		private boolean numeroValido;
		private boolean tipoClienteValido;
		private String numero;
		
//		private SucursalServicio servicio = new SucursalServicioImp();

		private List<TipoClienteVO> tiposDeClientes;
	
	public SujetoResidencialCreate2(){
		System.out.println("CONSTRUCTOR SUJETO-RESIDENCIAL-CREATE-2");
		
		visita = new VisitaVO();
		comPack.setCantidadPack(1);			
		frioCalorSeleccionado1 = new FrioCalorVO();
		
		sujeto = new SujetoVO();
		sucursal = new SucursalVO();
		numero = "";
		
		
//		FacesContext fc = FacesContext.getCurrentInstance();
//		Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();
//		sucursal = (SucursalVO) sessionParams.get("sucursal");
		
//		System.out.println("sucursal "+sucursal.getNombre() +" cliente "+sucursal.getSujeto().getTipoCliente().getTipoClienteId());
//		listaProductoPrecio = SelectOneMany.getAllProductosConPrecio(sucursal.getSujeto().getTipoCliente().getTipoClienteId());
	
	}
	
	/**
	 *Genera un map con los dias de la semana 
	 * 
	 */
	//--- IR DEL PASO 2 AL PASO 1 ---
	public String cargarSujeto(SujetoVO psujeto){
		
		this.sucursal.setSujeto(psujeto);
		
//		FacesContext fc = FacesContext.getCurrentInstance();
//		Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();
//		sessionParams.put("sucursal", sucursal);
		
		return Constante.URL_RESIDENCIAL_ALTA_PASO_UNO;
	}
	//--- VOLVER DEL PASO 3 AL PASO 2 ---
	public String volverVisita(){
		System.out.println("VOLVER-VISITA");
		return Constante.URL_RESIDENCIAL_ALTA_PASO_DOS;
	}
	
	//--- IR DE PASO 2 AL PASO 3 ---
	public String cargarResumen(){
		if (formularioValido()){
			this.setNombreCompleto(Util.getNombreCompleto(sucursal));// ver clase UTIL
			this.setDireccionCompleta(Util.getDireccion(sucursal));

			
			RepartoServicio servicio = new RepartoServicioImp();
			this.visita.getReparto().setNombre(servicio.getRepartoById(visita.getReparto().getRepartoId()).getNombre());
			System.out.println("Reparto:  "+ this.visita.getReparto().getNombre());

//			ProductoServicio ps = new ProductoServicioImp();
//			this.comPack.getPack().setNombre(ps.getPackById(comPack.getPack().getPackId()).getNombre());		
//			System.out.println("Pack:  "+ this.comPack.getPack().getNombre());
			
			return Constante.URL_RESIDENCIAL_ALTA_PASO_TRES;	
		}else
			return "";
	}

	public boolean formularioValido(){
		
		System.out.println("Productos Seleccionados:   "+productosSeleccionados.length);
		System.out.println("Pack:   "+comPack.getPack().getPackId());
		System.out.println("Frio Calor Seleccionados:   "+listaFrioCalorSeleccionados.size());
		
		
		ProductoServicio ps = new ProductoServicioImp();
//		this.comPack.getPack().setNombre(ps.getPackById(comPack.getPack().getPackId()).getNombre());		
//		System.out.println("Pack:  "+ this.comPack.getPack().getNombre());
		if ((this.productosSeleccionados.length > 0) || (this.comPack.getPack().getPackId() != 0)){

			if (this.comPack.getPack().getPackId() != 0)  {
				
				if (this.listaFrioCalorSeleccionados.size() > 0){
					if(this.productosSeleccionados.length > 0){
						// selecciono pack y productos validar si hay repetidos
						
						if (!existenRepetidos(productosSeleccionados, comPack.getPack())){
							this.comPack.getPack().setNombre(ps.getPackById(comPack.getPack().getPackId()).getNombre());		
							System.out.println("Pack:  "+ this.comPack.getPack().getNombre());
							System.out.println("PASA LA VALIDACION: Selecciono Productos y Pack NO repetidos");
							return true;
						}else{
							System.out.println("REPETIDOS");
							System.out.println("ERROR: Selecciono Productos y Pack, se encuentraron productos repetidos en La lista de productos y Pack");
							FacesContext.getCurrentInstance().addMessage("form::messages", 
									new FacesMessage(FacesMessage.SEVERITY_FATAL,"Selecciono Productos y Pack, se encuentraron productos repetidos en La lista de productos y Pack", ""));
							return false;
						}
						
					}else{
						this.comPack.getPack().setNombre(ps.getPackById(comPack.getPack().getPackId()).getNombre());		
						System.out.println("Pack:  "+ this.comPack.getPack().getNombre());
						System.out.println("PASA LA VALIDACION: Solo Selecciono Pack");
						return true;
					}
				}else{
					System.out.println("ERROR: Se ha seleccionado un pack y debe seleccionar al menos un Equipo FrioCalor");
					FacesContext.getCurrentInstance().addMessage("form::messages", 
							new FacesMessage(FacesMessage.SEVERITY_FATAL,"Se ha seleccionado un pack y debe seleccionar al menos un Equipo FrioCalor", ""));
					return false;
			
				}
			}else{
				System.out.println("PASA LA VALIDACION: Solo Selecciono Productos");
				return true;	
			}

		}else{
			
			System.out.println("ERROR: Debe seleccionar productos o packs");
			FacesContext.getCurrentInstance().addMessage("form::messages", 
					new FacesMessage(FacesMessage.SEVERITY_FATAL,"Debe seleccionar Productos o Packs ", ""));
			return false;
		}
	}
	
//	 public void onEdit(RowEditEvent event) {  
//		 	System.out.println("Listeners de edit");
//		 	System.out.println("Equipos seleccionados: "+equiposSeleccionados.length); 
////		 	listaFrioCalor.
//	    }  
//	 
	 public void onRowSelect(SelectEvent event) {  
	        FacesMessage msg = new FacesMessage("Frio Calor Seleccionado", ((FrioCalorVO) event.getObject()).getNumeroDeSerie());  
	        FacesContext.getCurrentInstance().addMessage(null, msg);  
	    }  
	
	 public void onRowSelect1(SelectEvent event) {  
	        FacesMessage msg = new FacesMessage("Frio Calor Seleccionado", ((FrioCalorVO) event.getObject()).getNumeroDeSerie());  
	        FacesContext.getCurrentInstance().addMessage(null, msg);  
	    }  
	 
	 public void agregarEquipo(){
//		System.out.println("equipo agregado");
//		System.out.println("El equipo seleccionado es:   "+frioCalorSeleccionado.getNumeroDeSerie());
//		System.out.println("Ubicacion es "+ubicacion);
		frioCalorSeleccionado.setUbicacion(ubicacion);
		setUbicacion("");
		listaFrioCalorSeleccionados.add(frioCalorSeleccionado);
		listaFrioCalor.remove(frioCalorSeleccionado);
	}

	public void quitarEquipoListener(FrioCalorVO fc){
		listaFrioCalor.add(fc);
		if  (listaFrioCalorSeleccionados.remove(fc)){
			System.out.println("Se elimino correamente   ");
		}
	}
	
	private static Map<String,Object> diasSemanales;
	static{
		diasSemanales = new LinkedHashMap<String,Object>();
		diasSemanales.put("Lunes", "1"); //label, value
		diasSemanales.put("Martes", "2");
		diasSemanales.put("Miercoles", "3");
		diasSemanales.put("Jueves", "4");
		diasSemanales.put("Viernes", "5");
		diasSemanales.put("Sabado", "6");
	}

	public String guardarSujetoResidencial(){
			
		System.out.println("GUARDAR SUJETO RESIDENCIAL");		
		
		sucursal.getSujeto().setTipoSujeto("RESIDENCIAL");
		guardarSujeto(sucursal.getSujeto());
		
		guardarSucursal(sucursal);

		visita.setSucursal(sucursal);
		guardarVisita(sucursal);
		
		if (productosSeleccionados.length > 0){
			guardarSucursalProductos();	
		}
		
		System.out.println("Comercializacion Pack es " + comPack.getPack().getPackId());		
		if (comPack.getPack().getPackId() != 0){
			comPack.setSucursal(sucursal);
			guardarComercializacionPack(comPack);
			if(listaFrioCalorSeleccionados.size() >0){
				guardarSucursalFrioCalor();
			}
			guardarModifFrioCalor(listaFrioCalorSeleccionados);
		}

		System.out.println("Alta Existosa");
		
		return Constante.URL_RESIDENCIAL_ALTA_PASO_CUATRO;
	}
	
	private void guardarModifFrioCalor(List<FrioCalorVO> listaFC){
		ProductoServicio ps = new ProductoServicioImp();
		for(FrioCalorVO fc : listaFC){
			fc.setEstado("CLIENTE");
			ps.updateFrioCalorVO(fc);
		}
		
	}
	
	private void guardarSujeto(SujetoVO s){
//		s.setFechaAlta(new Date());
//		System.out.println(s);
		SujetoServicio servicio = new SujetoServicioImpl();
		servicio.insertSujetoVO(s);
	}
	
	private void guardarSucursal(SucursalVO s){
		s.setProvincia("CORDOBA");
		s.setLocalidad("CORDOBA");
		s.setFechaAlta(new Date());
		
		System.out.println(s);
		
		SucursalServicio servicio = new SucursalServicioImp();
		servicio.insertSucursal(s);
	}
	
	private void guardarVisita(SucursalVO s){
		RepartoServicio servicio = new RepartoServicioImp();
		for(int i = 0; i<diasSeleccionados.length;i++){
			
			if(diasSeleccionados[i].equals("1")){
				visita.setLunes((short)1);
			}
			if(diasSeleccionados[i].equals("2")){
				visita.setMartes((short)1);
			}
			if(diasSeleccionados[i].equals("3")){
				visita.setMiercoles((short)1);
			}
			if(diasSeleccionados[i].equals("4")){
				visita.setJueves((short)1);
			}
			if(diasSeleccionados[i].equals("5")){
				visita.setViernes((short)1);
			}
			if(diasSeleccionados[i].equals("6")){
				visita.setSabado((short)1);
			}
		}
		servicio.insertVisita(visita);
	}
	
	private void guardarSucursalProductos(){
		System.out.println("Guardar SucursalProduc managed");
		SucursalServicio servicio = new SucursalServicioImp();
//		servicio.assignProductosSucursal(sucursal, getProductosSeleccionados());
	}
	
	private void guardarSucursalFrioCalor(){
		SucursalServicio servicio = new SucursalServicioImp();
		System.out.println(listaFrioCalorSeleccionados.size());

		//convierte lista de frio calor en a arrat de friocalorseleccionados
		equiposSeleccionados = (FrioCalorVO[]) listaFrioCalorSeleccionados.toArray(new FrioCalorVO[listaFrioCalorSeleccionados.size()]);

		servicio.assignEquiposSucursal(sucursal, getEquiposSeleccionados());
	}
	
	private void guardarComercializacionPack(ComercializacionPackVO cp){
		cp.setFechaAsignacion(new Date());
		System.out.println("Pack a Guardar: "+cp.toString());
		SucursalServicio ss = new SucursalServicioImp();
		ss.insertComercializcionPackVO(cp);
		
	}
	
	private boolean existenRepetidos(ProductoVO[] productos , PackVO pack){
		System.out.println("METODO EXITEN REPETIDOS");
		ProductoServicio ps = new ProductoServicioImp();
		pack = ps.getPackById(pack.getPackId());
		
		boolean existe = false;
		
		for(int i=0; i<productos.length;++i){
			if (pack.getProducto().getNombre().equals(productos[i].getNombre())){
				existe = true;
				break;
			} 
		}
		System.out.println("FIN METODO EXITEN REPETIDOS ");
		return existe;
	}
	
	//
	
	//--- IR DEL PASO 1 AL PASO 2 ---
		public String cargarVisita(SujetoVO psujeto){
			
			this.sucursal.setSujeto(psujeto);
			
//			FacesContext fc = FacesContext.getCurrentInstance();
//			Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();
//			sessionParams.put("sucursal", sucursal);
			listaProductoPrecio = SelectOneMany.getAllProductosConPrecio(sucursal.getSujeto().getTipoCliente().getTipoClienteId());
			return Constante.URL_RESIDENCIAL_ALTA_PASO_DOS;
		}
	
	//---METODOS PARA LA VALIDACION   PAGINA 1-----
	
		public void listenerNombre(){
			if (this.sucursal.getNombre().isEmpty()||this.sucursal.getNombre() ==null){
				this.deshabilitarGuardar = "true";
				this.nombreValido = false;
				FacesContext.getCurrentInstance().addMessage("form::errorlblNombre", 
						new FacesMessage(FacesMessage.SEVERITY_FATAL,"El Nombre del Sujeto no puede ser Vacio", "para continuar "));
			}else{
				this.nombreValido = true;
				if (this.apellidoValido && this.barrioValido && this.calleValido && this.numeroValido && this.tipoClienteValido) {
					this.deshabilitarGuardar = "false"; //HABILITO GUARDAR
				}	
			}
		}
		
		public void listenerApellido(){
			
			if (this.sucursal.getApellido().isEmpty()||this.sucursal.getApellido() == null){
				this.deshabilitarGuardar = "true";
				this.apellidoValido = false;
				FacesContext.getCurrentInstance().addMessage("form::errorlblApellido", 
						new FacesMessage(FacesMessage.SEVERITY_FATAL,"El apellido del Sujeto no puede ser Vacio", "para continuar "));
			}else{
				this.apellidoValido = true;
				if (this.nombreValido && this.barrioValido && this.calleValido && this.numeroValido && this.tipoClienteValido) {
					this.deshabilitarGuardar = "false"; //HABILITO GUARDAR
				}	
			}
		}
		
		public void listenerBarrio(){
			if (this.sucursal.getBarrio().isEmpty()||this.sucursal.getBarrio() == null){
				this.deshabilitarGuardar = "true";
				this.barrioValido = false;
				FacesContext.getCurrentInstance().addMessage("form::errorlblBarrio", 
						new FacesMessage(FacesMessage.SEVERITY_FATAL,"El Barrio del Sujeto no puede ser Vacio", "para continuar "));
			}else{
				this.barrioValido = true;
				if (this.nombreValido && this.apellidoValido && this.calleValido && this.numeroValido  && this.tipoClienteValido) {
					this.deshabilitarGuardar = "false"; //HABILITO GUARDAR
				}	
			}
		}
		
		public void listenerCalle(){
			if (this.sucursal.getCalle().isEmpty()||this.sucursal.getCalle() == null){
				this.deshabilitarGuardar = "true";
				this.calleValido = false;
				FacesContext.getCurrentInstance().addMessage("form::errorlblCalle", 
						new FacesMessage(FacesMessage.SEVERITY_FATAL,"La  Calle del Sujeto no puede ser Vacio", "para continuar "));
			}else{
				this.calleValido = true;
				if (this.nombreValido && this.barrioValido && this.apellidoValido && this.numeroValido  && this.tipoClienteValido) {
					this.deshabilitarGuardar = "false"; //HABILITO GUARDAR
				}	
			}
		}
		
		public void listenerNumero(){
			
			if (Validar.isNumeroEntero(this.numero)){
				sucursal.setNumero(Integer.parseInt(this.numero));
				if (sucursal.getNumero() > 0){
					this.numeroValido = true;
					if (this.nombreValido && this.barrioValido && this.calleValido && this.apellidoValido  && this.tipoClienteValido) {
						this.deshabilitarGuardar = "false"; //HABILITO GUARDAR
					}	
				}else{ 
					this.deshabilitarGuardar = "true";
					this.numeroValido = false;
					FacesContext.getCurrentInstance().addMessage("form::errorlblNumero", 
							new FacesMessage(FacesMessage.SEVERITY_FATAL,"El Numero debe mayor que 0", "para continuar "));
				}
			}else{
				FacesContext.getCurrentInstance().addMessage("form::errorlblNumero", 
						new FacesMessage(FacesMessage.SEVERITY_FATAL,"El Numero debe ser un numerico", "para continuar "));
				this.deshabilitarGuardar = "true";
				this.numeroValido = false;
			}
		}
		
		public void listenerTipoCliente(){
			if (sujeto.getTipoCliente().getTipoClienteId() > 0){
				this.tipoClienteValido = true;
				if (this.nombreValido && this.apellidoValido && this.barrioValido && this.calleValido && this.numeroValido) {
					this.deshabilitarGuardar = "false"; //HABILITO GUARDAR
					System.out.println("HABILITO GUARDAR  en tipoCliente");
				}	
			}else{ 
				this.deshabilitarGuardar = "true";
				this.tipoClienteValido = false;
				FacesContext.getCurrentInstance().addMessage("form::errorlblTipoCliente", 
						new FacesMessage(FacesMessage.SEVERITY_FATAL,"Debe Seleccionar un Tipo de Cliente", "para continuar "));
			}
		}
		
		//----------------------------------
	
		public String cancelarAlta(){
			return Constante.URL_RESIDENCIAL_LIST;
		}
	//TODO Get and Set
	
	public static Map<String, Object> getDiasSemanales() {
		return diasSemanales;
	}

	public static void setDiasSemanales(Map<String, Object> diasSemanales) {
		SujetoResidencialCreate2.diasSemanales = diasSemanales;
	}
	
	public String[] getDiasSeleccionados() {
		return diasSeleccionados;
	}

	public void setDiasSeleccionados(String[] diasSeleccionados) {
		this.diasSeleccionados = diasSeleccionados;
	}

	public VisitaVO getVisita() {
		return visita;
	}

	public void setVisita(VisitaVO visita) {
		this.visita = visita;
	}

	public ProductoVO[] getProductosSeleccionados() {
		return productosSeleccionados;
	}

	public void setProductosSeleccionados(ProductoVO[] productosSeleccionados) {
		this.productosSeleccionados = productosSeleccionados;
	}

	public ComercializacionPackVO getComPack() {
		return comPack;
	}

	public void setComPack(ComercializacionPackVO comPack) {
		this.comPack = comPack;
	}

	public FrioCalorVO[] getEquiposSeleccionados() {
		return equiposSeleccionados;
	}

	public void setEquiposSeleccionados(FrioCalorVO[] equiposSeleccionados) {
		this.equiposSeleccionados = equiposSeleccionados;
	}

	public List<ProductoVO> getListaProductoPrecio() {
		return listaProductoPrecio;
	}

	public void setListaProductoPrecio(List<ProductoVO> listaProductoPrecio) {
		this.listaProductoPrecio = listaProductoPrecio;
	}

	public List<FrioCalorVO> getListaFrioCalor() {
		return listaFrioCalor;
	}

	public void setListaFrioCalor(List<FrioCalorVO> listaFrioCalor) {
		this.listaFrioCalor = listaFrioCalor;
	}

	public FrioCalorVO getFrioCalorSeleccionado() {
		return frioCalorSeleccionado;
	}

	public void setFrioCalorSeleccionado(FrioCalorVO frioCalorSeleccionado) {
		this.frioCalorSeleccionado = frioCalorSeleccionado;
	}

	public List<FrioCalorVO> getListaFrioCalorSeleccionados() {
		return listaFrioCalorSeleccionados;
	}

	public void setListaFrioCalorSeleccionados(
			List<FrioCalorVO> listaFrioCalorSeleccionados) {
		this.listaFrioCalorSeleccionados = listaFrioCalorSeleccionados;
	}

	public String getUbicacion() {
		return ubicacion;
	}

	public void setUbicacion(String ubicacion) {
		this.ubicacion = ubicacion;
	}

	public SucursalVO getSucursal() {
		return sucursal;
	}

	public void setSucursal(SucursalVO sucursal) {
		this.sucursal = sucursal;
	}

	public String getNombreCompleto() {
		return nombreCompleto;
	}

	public void setNombreCompleto(String nombreCompleto) {
		this.nombreCompleto = nombreCompleto;
	}

	public String getDireccionCompleta() {
		return direccionCompleta;
	}

	public void setDireccionCompleta(String direccionCompleta) {
		this.direccionCompleta = direccionCompleta;
	}

	public FrioCalorVO getFrioCalorSeleccionado1() {
		return frioCalorSeleccionado1;
	}

	public void setFrioCalorSeleccionado1(FrioCalorVO frioCalorSeleccionado1) {
		this.frioCalorSeleccionado1 = frioCalorSeleccionado1;
	}
	
	//--------------------------------------------------
	
	public SujetoVO getSujeto() {
		return sujeto;
	}

	public void setSujeto(SujetoVO sujeto) {
		this.sujeto = sujeto;
	}

	public void setTiposDeClientes(List<TipoClienteVO> tiposDeClientes) {
		this.tiposDeClientes = tiposDeClientes;
	}

	public List<TipoClienteVO> getTiposDeClientes() {
		return tiposDeClientes;
	}

	public String getDeshabilitarGuardar() {
		return deshabilitarGuardar;
	}
	public void setDeshabilitarGuardar(String deshabilitarGuardar) {
		this.deshabilitarGuardar = deshabilitarGuardar;
	}
	public String getNumero() {
		return numero;
	}
	public void setNumero(String numero) {
		this.numero = numero;
	}	
	

}
